wayland: Hook tablets to GdkSeat
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 26 Jan 2016 18:25:19 +0000 (19:25 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Wed, 6 Apr 2016 14:12:13 +0000 (16:12 +0200)
Those are now also grabbed togetther with other master pointers,
so everything is able to interoperate on eg. popups triggered by
other devices.

gdk/wayland/gdkdevice-wayland.c

index f21ed62a8621f34d0d12ff7a4620525877e0e33e..4a7d2222867b2425a4f79511aa94abaa322287ec 100644 (file)
@@ -3676,6 +3676,7 @@ gdk_wayland_seat_grab (GdkSeat                *seat,
   guint32 evtime = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
   GdkDisplay *display = gdk_seat_get_display (seat);
   GdkWindow *native;
+  GList *l;
 
   native = gdk_window_get_toplevel (window);
 
@@ -3775,6 +3776,33 @@ gdk_wayland_seat_grab (GdkSeat                *seat,
                                     FALSE);
     }
 
+  if (wayland_seat->tablets &&
+      capabilities & GDK_SEAT_CAPABILITY_TABLET_STYLUS)
+    {
+      for (l = wayland_seat->tablets; l; l = l->next)
+        {
+          GdkWaylandTabletData *tablet = l->data;
+          GdkWindow *prev_focus = gdk_wayland_device_get_focus (tablet->master);
+
+          if (prev_focus != window)
+            device_emit_grab_crossing (tablet->master, prev_focus,
+                                       window, GDK_CROSSING_GRAB, evtime);
+
+          _gdk_display_add_device_grab (display,
+                                        tablet->master,
+                                        window,
+                                        native,
+                                        GDK_OWNERSHIP_NONE,
+                                        owner_events,
+                                        GDK_ALL_EVENTS_MASK,
+                                        _gdk_display_get_next_serial (display),
+                                        evtime,
+                                        FALSE);
+
+          gdk_wayland_device_update_window_cursor (tablet->master);
+        }
+    }
+
   return GDK_GRAB_SUCCESS;
 }
 
@@ -3784,6 +3812,7 @@ gdk_wayland_seat_ungrab (GdkSeat *seat)
   GdkWaylandSeat *wayland_seat = GDK_WAYLAND_SEAT (seat);
   GdkDisplay *display = gdk_seat_get_display (seat);
   GdkDeviceGrabInfo *grab;
+  GList *l;
 
   g_clear_object (&wayland_seat->grab_cursor);
 
@@ -3823,6 +3852,16 @@ gdk_wayland_seat_ungrab (GdkSeat *seat)
     {
       grab = _gdk_display_get_last_device_grab (display, wayland_seat->touch_master);
 
+      if (grab)
+        grab->serial_end = grab->serial_start;
+    }
+
+  for (l = wayland_seat->tablets; l; l = l->next)
+    {
+      GdkWaylandTabletData *tablet = l->data;
+
+      grab = _gdk_display_get_last_device_grab (display, tablet->master);
+
       if (grab)
         grab->serial_end = grab->serial_start;
     }